/*************************
 * 文件名：IOT_AccPassword.c
 * 描述：账号密码管理
 * 功能：
 * 1.显示管理员登录界面并处理登录
 * 2.显示工程师登录界面并处理登录
 * 3.管理员账号密码初始化
 * 4.管理员登录验证
 * 5.修改管理员登录密码,账号
 * 6.通过工号查找工程师信息并进行修改操作
 * 7.工程师修改密码
 * 创建人：IOT_王旭
 * 创建时间：2024年9月25日09:55:30
 ************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "IOT_PI_Menu.h"
#include "IOT_AdminFile.h"
#include "IOT_AccPassword.h"
#include "IOT_Admin_Function.h"
#include "IOT_Engineer_Function.h"

/*********************宏定义*****************/
#define ADMIN_LOGIN 1  // 管理员登录账号界面
#define ADMIN_RETURN 2 // 返回上一级

#define ENGINEER_LOGIN 1  // 工程师登录账号界面
#define ENGINEER_RETURN 2 // 返回上一级

/*************************
函数名称：IOT_GetTVal
描述：获取键盘中的键值
返回值：1~2：返回对应的值，若输入无效则返回-1
***************************/
int IOT_GetTVal()
{
    unsigned int TVal = 0;

    printf("请输入选择:");
    fflush(stdin);
    scanf("%d", &TVal);

    if (TVal > 2 || TVal < 1)
    {
        return -1;
    }
    return TVal;
}
/*************************
函数名称：IOT_AccountPassword_Function
描述：显示管理员登录界面并处理登录
参数：LinkList Head, EquipmentLink Arm
返回值：无
**************************/
void IOT_AdminAccPassword_Function(LinkList Head, EquipmentLink Arm)
{
    int result = -1;

    while (1)
    {
        system("cls");
        IOT_Admin_Login();
        result = IOT_GetTVal();

        switch (result)
        {
        case ADMIN_LOGIN:
            IOT_GetAdminPassword(Head, Arm);
            return;
            break;

        case ADMIN_RETURN:
            return;
            break;

        default:

            printf("输入错误，请重新输入！！！");
            break;
        }
        system("pause");
        system("cls");
    }
}

/*************************
函数名称：IOT_EngAccPassword_Function
描述：显示工程师登录界面并处理登录
参数：LinkList Head, EquipmentLink Arm
返回值：无
**************************/
void IOT_EngAccPassword_Function(LinkList Head, EquipmentLink Arm)
{
    int result = -1;

    while (1)
    {
        system("cls");
        IOT_Engineer_Login();
        result = IOT_GetTVal();

        switch (result)
        {
        case ENGINEER_LOGIN:
            IOT_GetEngineerPassword(Head, Arm);
            return;
            break;

        case ENGINEER_RETURN:
            return;
            break;

        default:

            printf("输入错误，请重新输入！！！");
            break;
        }
        system("pause");
        system("cls");
    }
}

/*************************
函数名称：IOT_InitAdminPASSLink
描述：管理员账号密码初始化
参数：无
返回值：OK
**************************/
int IOT_InitAdminPASSLink(LinkList Head)
{
    LinkList P;
    P = (LinkList)malloc(sizeof(Engineer));

    if (NULL == P)
    {
        printf("链表创建空间失败！！！\n");
        exit(ERROR);
    }
    P->next = NULL;

    strcpy(P->Adminaccount, "admin");   // 设置默认管理员账号
    strcpy(P->AdminPassword, "123456"); // 设置默认管理员密码
    Head->next = P;
    IOT_Engineer_FileWrite(Head, "Engineer"); // 将初始化信息写入文件

    return OK;
}
/*************************
函数名称：IOT_GetAdminPassword
描述：管理员登录验证
参数：LinkList Head, EquipmentLink Arm
返回值：OK，0
**************************/
int IOT_GetAdminPassword(LinkList Head, EquipmentLink Arm)
{
    char password[20]; // 用于存储用户输入的密码
    char account[20];  // 用于存储用户输入的账号

    printf("请输入管理员账号: ");
    fflush(stdin);
    scanf("%s", account);
    if (strcmp(account, Head->next->Adminaccount) == 0)
    {
        printf("请输入管理员密码: ");
        fflush(stdin);
        scanf("%s", password);

        if (strcmp(password, Head->next->AdminPassword) == 0)
        {
            printf("登录成功!\n");
            IOT_Admin_Function(Head, Arm);
            return OK;
        }
        else
        {
            printf("管理员密码错误，请重试!\n");
            return 0;
        }
    }

    else
    {
        printf("管理员账号错误，请重试!\n");
        return 0;
    }
    return 0;
}
/*************************
函数名称：IOT_RevisePassword
描述：修改管理员登录密码,账号
参数：无
返回值：无
**************************/
int IOT_RevisePassword(LinkList Head)
{
    LinkList p = Head->next;

    if (p == NULL)
    {
        printf("无存储的账号！！！");
        return ERROR;
    }

    while (p != NULL) // 寻找链表中的最后一个节点
    {
        char temp_Password[20] = {0};

        printf("新的管理员账号为：");
        fflush(stdin);
        scanf("%s", p->Adminaccount);

        printf("新的管理员密码为：");
        fflush(stdin);
        scanf("%s", p->AdminPassword);

        printf("\n");
        printf("-----------------------------请确认信息-----------------------------\n");
        printf("\n");
        printf("新账号为：%s                                      新密码为：%s\n", p->Adminaccount, p->AdminPassword);
        printf("\n");
        IOT_Engineer_FileWrite(Head, "Engineer");
        return OK;

        p = p->next;
    }

    printf("输入管理员账号错误！！！");
}
/*************************
函数名称：IOT_GetEngineerPassword
描述：通过工号查找工程师信息并进行修改操作
参数：无
返回值：无
**************************/
int IOT_GetEngineerPassword(LinkList Head, EquipmentLink Arm)
{
    IOT_Engineer_FileRead(Head, "Engineer");

    char account[20] = {0};  // 用于存储管理员输入的账号
    char password[20] = {0}; // 用于存储管理员输入的密码

    LinkList p = Head->next;

    if (NULL == p)
    {
        printf("没有添加工程师，请联系管理员！！！");
        return ERROR;
    }

    printf("请输入工程师账号: ");
    fflush(stdin);
    scanf("%s", account);

    while (NULL != p)
    {

        if (strcmp(account, p->ID) == 0) // 验证账号
        {
            printf("请输入工程师密码: ");
            fflush(stdin);
            scanf("%s", password);

            if (strcmp(password, p->password) == 0) // 验证密码
            {
                printf("登录成功!\n");
                IOT_Engineer_Function(Head, Arm); // 调用工程师功能
                return OK;
            }
            else
            {
                printf("工程师密码错误，请重试!\n");
                return 0;
            }
        }

        p = p->next;
    }
    printf("工程师账号错误，请重试!\n");
    return 0;
}

/*************************
函数名称：IOT_EnginEevPassLink
描述：工程师修改密码
参数：LinkList Head
返回值：无
**************************/
int IOT_EnginEevPassLink(LinkList Head)
{

    LinkList p = Head->next;

    char ID[20] = {0};
    char input[20] = {0};

    if (p == NULL)
    {
        printf("未添加！！！");
        return ERROR;
    }
    printf("请输入要修改的工程师账号：");
    scanf("%s", ID);
    while (p != NULL) // 寻找链表中的最后一个节点
    {
        if (0 == strcmp(ID, p->ID))
        {

            printf("你要修改的密码为：\n");
            fflush(stdin);
            scanf("%s", input);

            strcpy(p->password, input);

            printf("-------请确认信息------- \n");
            printf("新的密码为：%s\n", p->password);
            IOT_Engineer_FileWrite(Head, "Engineer");
            return OK;
        }

        p = p->next;
    }
    printf("查无此工程师");
}
